-- Copyright (c) 2015,2016 Lucky Byte, Inc.
--
-- Summary : 助农取款交易成功后处理
--
-- Author  : 吴小虎 <xiaohu@lucky-byte.com>
-- Since   : 2016.7.17
--
-- History
--  * 2015.7.17 : 创建此文件
--  * 2015.7.29 : 完善注释
--

-- 助农取款成功后处理
--  1. 如果当前交易终端配置了助农取款代付，则创建助农取款代付订单;
--
local function _postproc_t60()
    logger.debug('开始执行助农取款交易后处理...')

    -- 检查当前的交易终端是否配置了助农取款代付
    local _t = jdbc.select([[
        select * from pay_p2 where
            usable = true and t60_termid = ? and tz1_termid is not null
    ]], reqt.term.get('uuid'))

    -- 如果没有查询结果，则说明：
    --  1. 此终端上的助农取款无需代付；
    --  2. 此终端上的助农取款需要代付，但是忘记了增加配置；
    if _t.count == 0 then
        logger.debug('终端[%s]没有出现在助农取款代付配置中，无需创建代付订单.',
            reqt.term.get('termid'))
        return true
    end
    local _p2_record = _t.get_record(0)

    logger.debug('终端[%s]出现在助农取款代付配置[%s]中，开始创建代付订单...',
        reqt.term.get('termid'), _p2_record.get('uuid'))

    -- 取款金额，不可能为空，因为交易前处理已经检查过
    local _tramt = reqt.get_tramt()

    -- 计算代付手续费
    -- 这里计算的手续费应该是准确的，因为在交易转发后，可以获取准确的卡 bin 信息
    local _p2_fee = core.fee.calc({
        uuid  = _p2_record.get('t60_fee'), tramt = _tramt,
        debit = reqt.dcflag == 1
    })

    -- 检查手续费是否有效
    -- 如果计算手续费错误，则不能创建订单
    if _p2_fee < 0 then
        notify.error('计算出助农代付手续费[%s]小于[0.0]，不能创建助农代付订单.', _p2_fee)
        return false
    end
    -- 手续费大于交易，也不能创建订单
    if _p2_fee > _tramt then
        notify.error('计算出助农代付手续费[%s]大于交易金额[%s]，不能创建助农代付订单.',
            _p2_fee, _tramt)
        return '08'
    end

    -- 在助农代付订单中插入一条新记录，状态为未受理，后续系统接收到助农代付交易时，
    -- 将通过查询此订单来进行代付，订单只能受理一次
    local _order_uuid = uuid()
    local _ret = jdbc.update([[
        insert into pay_p2_order (
            uuid, p2_uuid, t60_uuid, p2_fee, status, notes
        ) values (
            ?, ?, ?, ?, 1, '助农取款成功，尚未代付'
        )
    ]], _order_uuid, _p2_record.get('uuid'), reqt.uuid, _p2_fee)

    -- 根据数据库操作结果输出一条日志信息，不是非常重要
    if _ret < 0 then
        logger.error('创建助农代付订单失败，助农取款交易流水为[%s].', reqt.uuid)
        return false
    end
    logger.info('助农代付订单[%s]创建成功...', _order_uuid)
    return true
end


return _postproc_t60
